/*
 * phal_io_port.h
 *
 *  Created on: 17/02/2010
 *      Author: gustavo
 */

#ifndef PHAL_IO_PORT_H_
#define PHAL_IO_PORT_H_


#include "target.h"
#include "padl_gpio.h"
#include "padl_sysctrl.h"
#include "padl_pincon.h"

#include "../config/phal_io_port_config.h"


typedef enum {
	phal_io_port_Port0,
	phal_io_port_Port1,
	phal_io_port_Port2,
	phal_io_port_Port3,
	phal_io_port_Port4
} phal_io_port_PortId;

typedef enum {
	phal_io_port_Pin0,
	phal_io_port_Pin1,
	phal_io_port_Pin2,
	phal_io_port_Pin3,
	phal_io_port_Pin4,
	phal_io_port_Pin5,
	phal_io_port_Pin6,
	phal_io_port_Pin7,
	phal_io_port_Pin8,
	phal_io_port_Pin9,
	phal_io_port_Pin10,
	phal_io_port_Pin11,
	phal_io_port_Pin12,
	phal_io_port_Pin13,
	phal_io_port_Pin14,
	phal_io_port_Pin15,
	phal_io_port_Pin16,
	phal_io_port_Pin17,
	phal_io_port_Pin18,
	phal_io_port_Pin19,
	phal_io_port_Pin20,
	phal_io_port_Pin21,
	phal_io_port_Pin22,
	phal_io_port_Pin23,
	phal_io_port_Pin24,
	phal_io_port_Pin25,
	phal_io_port_Pin26,
	phal_io_port_Pin27,
	phal_io_port_Pin28,
	phal_io_port_Pin29,
	phal_io_port_Pin30,
	phal_io_port_Pin31
} phal_io_port_PinId;

typedef U32 phal_io_port_PortStatus;

typedef BOOL phal_io_port_PinStatus;
#define phal_io_port_STATUS_OFF	((phal_io_port_PinStatus)FALSE)
#define phal_io_port_STATUS_ON	((phal_io_port_PinStatus)TRUE)

typedef BOOL phal_io_port_PinDirection;
#define phal_io_port_DIR_INPUT	((phal_io_port_PinDirection)FALSE)
#define phal_io_port_DIR_OUTPUT	((phal_io_port_PinDirection)TRUE)

#define phal_io_port_GPIO_PORT(port) \
	((port == phal_io_port_Port0) ? (padl_gpio_GPIO0) :\
	(port == phal_io_port_Port1) ? (padl_gpio_GPIO1) :\
	(port == phal_io_port_Port2) ? (padl_gpio_GPIO2) :\
	(port == phal_io_port_Port3) ? (padl_gpio_GPIO3) :\
								  (padl_gpio_GPIO4))

#define phal_io_port_init() \
	padl_sysctrl_ENABLE_FAST_GPIO();\
	padl_pincon_DISABLE_ETM();

#define phal_io_port_setPortStatus(port, status) \
	{\
		padl_gpio_GPIOType *gpioPort = phal_io_port_GPIO_PORT(port);\
		gpioPort->FIOCLR = 0xFFFFFFFF;\
		gpioPort->FIOSET = status;\
	}

#define phal_io_port_setPinStatus(port, pin, status) \
	if(status){\
		phal_io_port_GPIO_PORT(port)->FIOSET = 1 << ((U32)pin);\
	}\
	else{\
		phal_io_port_GPIO_PORT(port)->FIOCLR = 1 << ((U32)pin);\
	}

#define phal_io_port_getPortStatus(port) \
	((phal_io_port_PortStatus) phal_io_port_GPIO_PORT(port)->FIOPIN)

#define phal_io_port_getPinStatus(port, pin) \
	((phal_io_port_PinStatus) phal_io_port_GPIO_PORT(port)->FIOPIN >> ((U32)pin))

#define phal_io_port_setPinDirection(port, pin, dir) \
	(dir) ? \
	(TRUE | (phal_io_port_GPIO_PORT(port)->FIODIR |= dir << ((U32)pin))) :\
	(TRUE | (phal_io_port_GPIO_PORT(port)->FIODIR &= ~(dir << ((U32)pin))))

#define phal_io_port_getPinDirection(port, pin) \
	((phal_io_port_PinDirection) phal_io_port_GPIO_PORT(port)->FIODIR >> ((U32)pin))

#endif /* PHAL_IO_PORT_H_ */
